// 统一封装axios
// 我们的接口有统一的规则,/api开头的
// /api可以作为基地址
// 请求需要权限的接口的时候，需要注入token
// 配置超时的时间

import axios from 'axios'
import store from '@/store'
import { Message } from 'element-ui'
import router from '@/router'

// 测试环境我发起的请求，统一的规则 https://heima.hr.net.com/api/xxxx >> 返回的测试环境的数据
// 正式环境的请求，统一的规则 https://heima.hr.net.com/prod-api/xxxx >> 返回的是正式环境的数据

const request = axios.create({
  // 添加基准的时候，没有把真实的接口服务写在这里
  // 使用环境变量来设置基地址，环境变量是在项目运行的时候，根据运行的环境来设置的
  // 如果是开发环境，设置的值为/api
  // 如果是生产环境，设置的值为/prod-api
  baseURL: process.env.VUE_APP_BASE_API, // 基准地址
  timeout: 10000 // 超时时间
})

// 请求拦截器
// 注入token
request.interceptors.request.use((config) => {
  console.log('23')
  // 进行token的注入
  // 判断有没有token
  const token = store.getters.token // 获取vuex里面的token数据

  if (token) {
    // 请求头里面注入token
    config.headers.Authorization = `Bearer ${token}` // 注意：Bearer和token之间需要有个一个空格
  }

  //   一定要return回去
  return config
}, err => {
  // 如果请求出错，return一个失败状态的promise即可
  return Promise.reject(err)
})

// 封装响应拦截器 >> 处理后端返回的数据是否出错，如果出错return失败的Promise
request.interceptors.response.use((response) => {
  // 什么时候会走成功地处理函数，什么时候走失败的处理函数
  // console.log(response.data)
  // 如果后端返回的为二进制的流格式，直接返回当前blog对象
  if (response.data instanceof Blob) return response.data
  const { success, data } = response.data
  // 需要判断后端返回的success字段是否为true，来确定请求是否成功
  if (success) {
    // 表示请求成功了
    return data
  } else {
    // 进行一个错误的提示
    Message({
      type: 'error',
      message: response.data.message || '请求出错了'
    })
    // 如果success不为true，表示请求出错了，return一个失败的Promise
    return Promise.reject(new Error(response.data.message || '请求出错了'))
  }
}, err => {
  // 判断token失效 ==> 判断后端返回的状态码是不是401
  if (err.response.status === 401) {
    // console.log('token过期')
    // 退出登录，跳转登录页面
    // 清空用户信息
    // 清空token
    // 封装一个actins用于处理清空用户信息和token的逻辑
    store.dispatch('user/logout')
    router.push('/login')
    // 错误提示
    Message.info('登录状态已过期，请重新登录')
    return Promise.reject(err)
  }
  Message.error(err.response.data.message || '请求出错了')
  // 让当前请求失败 >> 为了让他不在接口请求的地方走正确地处理逻辑
  return Promise.reject(err)
})

// 默认导出

export default request

